import request from "@/utils/request";
import httpRequest from "@/utils/requestUtil";
import { IObject } from "../common/common";
const CONTRACT_BASE_URL = "/business/contract";

const ContractAPI = {
  /** 获取分页数据 */
  getPage(queryParams?: ContractPageQuery) {
    return httpRequest.get<PageResult<ContractPageVO[]>>(
      `${CONTRACT_BASE_URL}/loadPage`,
      queryParams
    );
  },

  /**
   * 获取表单数据
   *
   * @param id ID
   * @returns 表单数据
   */
  getFormData(id: string) {
    return request<any, ContractPageVO>({
      url: `${CONTRACT_BASE_URL}/load/${id}`,
      method: "get",
    });
  },

  /**
   * 获取合同详情
   *
   * @param id ID
   * @returns 表单数据
   */
  getDetail(id: string) {
    return request<any, ContractDetailVO>({
      url: `${CONTRACT_BASE_URL}/loadDetail`,
      method: "get",
      params: { id },
    });
  },

  /** 第一步： 创建合同基础信息 */
  create(data: ContractForm) {
    return request<any, string>({
      url: `${CONTRACT_BASE_URL}/createBasicInfo`,
      method: "post",
      data,
    });
  },

  /** 第二步： 填写合同字段 */
  fullContract(data: ContractFillForm) {
    return request<any, boolean>({
      url: `${CONTRACT_BASE_URL}/fullContract`,
      method: "post",
      data,
    });
  },

  /** 第三步： 添加合同条目 */
  addItems(data: ContractMaterialForm) {
    return request<any, boolean>({
      url: `${CONTRACT_BASE_URL}/addItems`,
      method: "post",
      data,
    });
  },

  /**
   * 更新合同
   * @param id ID
   * @param data 表单数据
   */
  update(data: ContractForm) {
    return request<any, ContractPageVO>({
      url: `${CONTRACT_BASE_URL}/update`,
      method: "post",
      data,
    });
  },

  /**
   * 删除合同
   */
  deleteById(id: string) {
    return request({
      url: `${CONTRACT_BASE_URL}/delete/${id}`,
      method: "get",
    });
  },

  /**
   * 绑定客户签字附件
   */
  bindCustomerSign(params: { contractId: string; customerSignId: string }) {
    return request<any, ContractDetailVO>({
      url: `${CONTRACT_BASE_URL}/bindCustomerSign`,
      method: "get",
      params,
    });
  },

  /**
   * 合同下载
   */
  download(id: string) {
    return request<any, Blob>({
      url: `${CONTRACT_BASE_URL}/download?id=${id}`,
      method: "get",
      responseType: "blob",
    });
  },
};

export default ContractAPI;

/** 分页查询参数 */
export interface ContractPageQuery extends PageQuery {
  /** 搜索关键字 */
}

/** 分页对象 */
export interface ContractPageVO {
  /** 合同ID */
  id: string;
  /** 合同名称 */
  name: string;
  /** 客户id */
  customerId: string;

  customerName?: string;
  /** 甲方 可以回填客户名称，也可以自定义成其他 */
  partyA: string;
  /** 乙方 */
  partyB: string;
  /** 合同状态 */
  status: string;
  /** 合同内容 */
  content?: string;
  /** 合同变动的json参数 */
  params?: string;
  /** 签订时间 */
  signTime?: string;
  /** 开始时间 */
  startTime?: string;
  /** 结束时间 */
  endTime?: string;
  /** 总金额 */
  amount: number;
  houseId?: string;
  houseName?: string;
  saleMealName?: string;
}

/** 基础信息表单 */
export interface ContractForm {
  /** 合同ID */
  id?: string;
  /** 合同名称 */
  name: string;
  /** 客户id */
  customerId?: string;
  /** 甲方 */
  partyA: string;
  /** 乙方 */
  partyB: string;
  /** 开始时间 */
  startTime: string;
  /** 结束时间 */
  endTime: string;
  /** 总金额 */
  amount?: number;
  /** 合同内容 */
  content?: string;
  houseId?: string;
  houseName?: string;
}

/** 合同详细信息 */
export interface ContractDetailVO extends ContractPageVO {
  /** 当前用户是否有任务,这里有设计流程任务和施工任务 */
  hasTask: boolean;
  /** 是否已启动流程 */
  started: boolean;
  /** 材料列表 */
  items: ContractItem[];
}

/** 填写合同表单 */
export interface ContractFillForm {
  /** 合同ID */
  id?: string;
  /** 合同内容 */
  content: string;
  /** 键值对 */
  pairMap: { [key: string]: string };
}

/** 合同条目表单（套餐材料） */
export interface ContractMaterialForm {
  /** 合同ID */
  id?: string;
  saleMealName?:string;
  items: ContractItem[];
}

/** 合同条目项（套餐材料） */
export interface ContractItem {
  id?: string;
  /** 合同id */
  contractId?: string;
  /** 合同项资源id(主材，辅材，定额，其他) */
  resourceId?: string;
  /** 冗余名称 */
  name?: string;
  remark?: string;
  /** 单位 */
  unit?: string;
  /** 价格 */
  price?: number | string;
  /** 数量 */
  quantity: number;
  /** 规格 */
  spec?: string;
  /** 代码 */
  code?: string;
  /** 类型 */
  itemType?: string;
}

export enum ContractStatus {
  WAIT_SIGN = "WAIT_SIGN",
  FIRST_SIGN = "FIRST_SIGN",
  DESIGN_SIGN = "DESIGN_SIGN",
  EXEC = "EXEC",
  OVERDUE = "OVERDUE",
}

export const Contract_Status_Label: IObject = {
  [ContractStatus.WAIT_SIGN]: "待签订",
  [ContractStatus.FIRST_SIGN]: "已签订，待设计", //初次签订，进入设计复核
  [ContractStatus.DESIGN_SIGN]: "设计完成，待执行", //设计完成后签订
  [ContractStatus.EXEC]: "执行中",
  [ContractStatus.OVERDUE]: "已过期",
};

export const defaultContractForm: ContractForm = {
  name: "",
  customerId: undefined,
  partyA: "",
  partyB: "",
  startTime: "",
  endTime: "",
  amount: 0,
};
